using System;
using System.Collections.Generic;
using UD.GRAL.Entity;
using Microsoft.Practices.EnterpriseLibrary.Data;
using System.Data.Common;
using System.Data;
using UD.Utilities.Exceptions;

namespace UD.GRAL.DataAccess
{
    public class TipoDocumentoDAL : GeneralDAL
    {
        public TipoDocumentoDAL()
        {
        }
        public int InsertarTipoDocumento(TipoDocumento pTipoDocumento)
        {
            try
            {
                Database vDataBase = ObtenerInstancia();
                using (DbCommand vDbCommand = vDataBase.GetStoredProcCommand("usp_SYSEXTUD_GRAL_TipoDocumento_Insertar"))
                {
                    int vResultado;
                    vDataBase.AddOutParameter(vDbCommand, "@IdTipoDocumento", DbType.Int32, 18);
                    vDataBase.AddInParameter(vDbCommand, "@CodTipoDocumento", DbType.String, pTipoDocumento.CodTipoDocumento);
                    vDataBase.AddInParameter(vDbCommand, "@NombreTipoDocumento", DbType.String, pTipoDocumento.NombreTipoDocumento);
                    vDataBase.AddInParameter(vDbCommand, "@Estado", DbType.Boolean, pTipoDocumento.Estado);
                    vDataBase.AddInParameter(vDbCommand, "@UsuarioCrea", DbType.String, pTipoDocumento.UsuarioCrea);
                    vResultado = vDataBase.ExecuteNonQuery(vDbCommand);
                    pTipoDocumento.IdTipoDocumento = Convert.ToInt32(vDataBase.GetParameterValue(vDbCommand, "@IdTipoDocumento").ToString());
                    GenerarLogAuditoria(pTipoDocumento, vDbCommand);
                    return vResultado;
                }
            }
            catch (UserInterfaceException)
            {
                throw;
            }
            catch (Exception ex)
            {
                 throw new GenericException(ex);
            }
        }
        public int ModificarTipoDocumento(TipoDocumento pTipoDocumento)
        {
            try
            {
                Database vDataBase = ObtenerInstancia();
                using (DbCommand vDbCommand = vDataBase.GetStoredProcCommand("usp_SYSEXTUD_GRAL_TipoDocumento_Modificar"))
                {
                    int vResultado;
                    vDataBase.AddInParameter(vDbCommand, "@IdTipoDocumento", DbType.Int32, pTipoDocumento.IdTipoDocumento);
                    vDataBase.AddInParameter(vDbCommand, "@CodTipoDocumento", DbType.String, pTipoDocumento.CodTipoDocumento);
                    vDataBase.AddInParameter(vDbCommand, "@NombreTipoDocumento", DbType.String, pTipoDocumento.NombreTipoDocumento);
                    vDataBase.AddInParameter(vDbCommand, "@Estado", DbType.Boolean, pTipoDocumento.Estado);
                    vDataBase.AddInParameter(vDbCommand, "@UsuarioModifica", DbType.String, pTipoDocumento.UsuarioModifica);
                    vResultado = vDataBase.ExecuteNonQuery(vDbCommand);
                    GenerarLogAuditoria(pTipoDocumento, vDbCommand);
                    return vResultado;
                }
            }
            catch (UserInterfaceException)
            {
                throw;
            }
            catch (Exception ex)
            {
                 throw new GenericException(ex);
            }
        }
        public int EliminarTipoDocumento(TipoDocumento pTipoDocumento)
        {
            try
            {
                Database vDataBase = ObtenerInstancia();
                using (DbCommand vDbCommand = vDataBase.GetStoredProcCommand("usp_SYSEXTUD_GRAL_TipoDocumento_Eliminar"))
                {
                    int vResultado;
                    vDataBase.AddInParameter(vDbCommand, "@IdTipoDocumento", DbType.Int32, pTipoDocumento.IdTipoDocumento);
                    vResultado = vDataBase.ExecuteNonQuery(vDbCommand);
                    GenerarLogAuditoria(pTipoDocumento, vDbCommand);
                    return vResultado;
                }
            }
            catch (UserInterfaceException)
            {
                throw;
            }
            catch (Exception ex)
            {
                 throw new GenericException(ex);
            }
        }


        public TipoDocumento ConsultarTipoDocumento(int pIdTipoDocumento)
        {
            try
            {
                Database vDataBase = ObtenerInstancia();
                using (DbCommand vDbCommand = vDataBase.GetStoredProcCommand("usp_SYSEXTUD_GRAL_TipoDocumento_Consultar"))
                {
                    vDataBase.AddInParameter(vDbCommand, "@IdTipoDocumento", DbType.Int32, pIdTipoDocumento);
                    using (IDataReader vDataReaderResults = vDataBase.ExecuteReader(vDbCommand))
                    {
                        TipoDocumento vTipoDocumento = new TipoDocumento();
                        while (vDataReaderResults.Read())
                        {
                            vTipoDocumento.IdTipoDocumento = vDataReaderResults["IdTipoDocumento"] != DBNull.Value ? Convert.ToInt32(vDataReaderResults["IdTipoDocumento"].ToString()) : vTipoDocumento.IdTipoDocumento;
                            vTipoDocumento.CodTipoDocumento = vDataReaderResults["CodTipoDocumento"] != DBNull.Value ? Convert.ToString(vDataReaderResults["CodTipoDocumento"].ToString()) : vTipoDocumento.CodTipoDocumento;
                            vTipoDocumento.NombreTipoDocumento = vDataReaderResults["NombreTipoDocumento"] != DBNull.Value ? Convert.ToString(vDataReaderResults["NombreTipoDocumento"].ToString()) : vTipoDocumento.NombreTipoDocumento;
                            vTipoDocumento.Estado = vDataReaderResults["Estado"] != DBNull.Value ? Convert.ToBoolean(vDataReaderResults["Estado"].ToString()) : vTipoDocumento.Estado;
                            vTipoDocumento.UsuarioCrea = vDataReaderResults["UsuarioCrea"] != DBNull.Value ? Convert.ToString(vDataReaderResults["UsuarioCrea"].ToString()) : vTipoDocumento.UsuarioCrea;
                            vTipoDocumento.FechaCrea = vDataReaderResults["FechaCrea"] != DBNull.Value ? Convert.ToDateTime(vDataReaderResults["FechaCrea"].ToString()) : vTipoDocumento.FechaCrea;
                            vTipoDocumento.UsuarioModifica = vDataReaderResults["UsuarioModifica"] != DBNull.Value ? Convert.ToString(vDataReaderResults["UsuarioModifica"].ToString()) : vTipoDocumento.UsuarioModifica;
                            vTipoDocumento.FechaModifica = vDataReaderResults["FechaModifica"] != DBNull.Value ? Convert.ToDateTime(vDataReaderResults["FechaModifica"].ToString()) : vTipoDocumento.FechaModifica;
                        }
                        return vTipoDocumento;
                    }
                }
            }
            catch (UserInterfaceException)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new GenericException(ex);
            }
        }

        public List<TipoDocumento> ConsultarTipoDocumentos(String pCodTipoDocumento, String pNombreTipoDocumento, Boolean? pEstado)
        {
            try
            {
                Database vDataBase = ObtenerInstancia();
                using (DbCommand vDbCommand = vDataBase.GetStoredProcCommand("usp_SYSEXTUD_GRAL_TipoDocumentos_Consultar"))
                {
                    if(pCodTipoDocumento != null)
                         vDataBase.AddInParameter(vDbCommand, "@CodTipoDocumento", DbType.String, pCodTipoDocumento);
                    if(pNombreTipoDocumento != null)
                         vDataBase.AddInParameter(vDbCommand, "@NombreTipoDocumento", DbType.String, pNombreTipoDocumento);
                    if(pEstado != null)
                         vDataBase.AddInParameter(vDbCommand, "@Estado", DbType.Boolean, pEstado);
                    using (IDataReader vDataReaderResults = vDataBase.ExecuteReader(vDbCommand))
                    {
                        List<TipoDocumento> vListaTipoDocumento = new List<TipoDocumento>();
                        while (vDataReaderResults.Read())
                        {
                                TipoDocumento vTipoDocumento = new TipoDocumento();
                            vTipoDocumento.IdTipoDocumento = vDataReaderResults["IdTipoDocumento"] != DBNull.Value ? Convert.ToInt32(vDataReaderResults["IdTipoDocumento"].ToString()) : vTipoDocumento.IdTipoDocumento;
                            vTipoDocumento.CodTipoDocumento = vDataReaderResults["CodTipoDocumento"] != DBNull.Value ? Convert.ToString(vDataReaderResults["CodTipoDocumento"].ToString()) : vTipoDocumento.CodTipoDocumento;
                            vTipoDocumento.NombreTipoDocumento = vDataReaderResults["NombreTipoDocumento"] != DBNull.Value ? Convert.ToString(vDataReaderResults["NombreTipoDocumento"].ToString()) : vTipoDocumento.NombreTipoDocumento;
                            vTipoDocumento.Estado = vDataReaderResults["Estado"] != DBNull.Value ? Convert.ToBoolean(vDataReaderResults["Estado"].ToString()) : vTipoDocumento.Estado;
                            vTipoDocumento.UsuarioCrea = vDataReaderResults["UsuarioCrea"] != DBNull.Value ? Convert.ToString(vDataReaderResults["UsuarioCrea"].ToString()) : vTipoDocumento.UsuarioCrea;
                            vTipoDocumento.FechaCrea = vDataReaderResults["FechaCrea"] != DBNull.Value ? Convert.ToDateTime(vDataReaderResults["FechaCrea"].ToString()) : vTipoDocumento.FechaCrea;
                            vTipoDocumento.UsuarioModifica = vDataReaderResults["UsuarioModifica"] != DBNull.Value ? Convert.ToString(vDataReaderResults["UsuarioModifica"].ToString()) : vTipoDocumento.UsuarioModifica;
                            vTipoDocumento.FechaModifica = vDataReaderResults["FechaModifica"] != DBNull.Value ? Convert.ToDateTime(vDataReaderResults["FechaModifica"].ToString()) : vTipoDocumento.FechaModifica;
                                vListaTipoDocumento.Add(vTipoDocumento);
                        }
                        return vListaTipoDocumento;
                    }
                }
            }
            catch (UserInterfaceException)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new GenericException(ex);
            }
        }
    }
}
